# NumPy 提供了 numpy.linalg 模块，该模块中包含了一些常用的线性代数计算方法
# dot	两个数组的点积。
# vdot	两个向量的点积。
# inner	两个数组的内积。
# matmul	两个数组的矩阵积。
# det	计算输入矩阵的行列式。
# solve	求解线性矩阵方程。
# inv	计算矩阵的逆矩阵，逆矩阵与原始矩阵相乘，会得到单位矩阵。

import numpy as np

A = [1, 2, 3]
B = [4, 5, 6]
print(np.dot(A, B))  # 32

a = np.array([[100, 200],
              [23, 12]])
b = np.array([[10, 20],
              [12, 21]])
dot = np.dot(a, b)
print(dot)

# [[3400 6200]
# [ 374  712]]

vdot = np.vdot(a, b)  # 5528

# inner() 方法用于计算数组之间的内积。当计算的数组是一维数组时，它与 dot() 函数相同，若输入的是多维数组则两者存在不同
A = [[1, 10],
     [100, 1000]]
B = [[1, 2],
     [3, 4]]
# inner函数
print(np.inner(A, B))
# [[  21   43]
# [2100 4300]]
# dot函数
print(np.dot(A, B))
# [[  31   42]
# [3100 4200]]

# matmul() 该函数返回两个矩阵的乘积，假如两个矩阵的维度不一致，就会产生错误。
a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
b = np.array([[23, 23, 12], [2, 1, 2], [7, 8, 9]])
mul = np.matmul(a, b)
print(mul)
# [[ 48  49  43]
# [144 145 112]
# [240 241 181]]

# numpy.linalg.det()该函数使用对角线元素来计算矩阵的行列式，计算 2*2（两行两列） 的行列式
a = np.array([[1, 2], [3, 4]])
print(np.linalg.det(a))  # -2.0000000000000004

# numpy.linalg.solve() 该函数用于求解线性矩阵方程组，并以矩阵的形式表示线性方程的解
m = np.array([[3, 2, 1], [1, 1, 1], [1, 2, -1]])
print('数组 m：')
print(m)
print('矩阵 n：')
n = np.array([[10], [6], [2]])
print(n)
x = np.linalg.solve(m, n)
print(x)  # x为线性方程的解：
# [[1.]
# [2.]
# [3.]]

# numpy.linalg.inv() 该函数用于计算矩阵的逆矩阵，逆矩阵与原矩阵相乘得到单位矩阵
a = np.array([[1, 2], [3, 4]])
b = np.linalg.inv(a)
print("求逆:", b)
# [[-2.   1. ]
# [ 1.5 -0.5]]

# NumPy矩阵乘法
# 矩阵乘法是将两个矩阵作为输入值，并将 A 矩阵的行与 B 矩阵的列对应位置相乘再相加，从而生成一个新矩阵
# 矩阵乘法运算被称为向量化操作，向量化的主要目的是减少使用的 for 循环次数或者根本不使用。这样做的目的是为了加速程序的计算。

# multiple() 函数用于两个矩阵的逐元素乘法
array1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], ndmin=3)
array2 = np.array([[9, 8, 7], [6, 5, 4], [3, 2, 1]], ndmin=3)
result = np.multiply(array1, array2)
# array([[ [ 9, 16, 21], [24, 25, 24],[21, 16,  9] ]])

# matmul() 用于计算两个数组的矩阵乘积。示例如下：
array1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], ndmin=3)
array2 = np.array([[9, 8, 7], [6, 5, 4], [3, 2, 1]], ndmin=3)
result2 = np.matmul(array1, array2)
# （[[ [30，24，18]，[84，69，54 ]，[138，114，90] ]]）

# dot() 函数用于计算两个矩阵的点积
array1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], ndmin=3)
array2 = np.array([[9, 8, 7], [6, 5, 4], [3, 2, 1]], ndmin=3)
result3 = np.dot(array1, array2)
# array([[ [[ 30,  24,  18]],[[ 84,  69,  54]],[[138, 114,  90]] ]])
